Argo Rollouts 由 Kubernetes Controller 以及一組 CRDs 所組成,能幫助我們自動化實現部署策略如 Blue/Green Deployment、canary,當更新應用程式出現異常時,也能協助自動 Rollbacks,降低系統的停機風險。
可以把 Argo Rollouts 想成 Argo CD 的擴充套件,原生 Argo CD 只能使用 Kubernetes 的 Rolling Update 功能更新應用程式,安裝 Argo Rollouts 後即可使用進階部署策略並結合 GitOps Workflow。使用者只需在 Git 上 Commit 並 Push 到 Repo,Argo CD 就能使用 Blue/Green Deployment、canary 等方式自動化完成部署任務。
Argo Rollouts 由下列元件所組成
負責追蹤是否有新的部署任務需要執行,檢查 Rollout
元件的變動,並將修改的部分建立部署策略將更新部署到 Kubernetes。
Rollout 可以想像成能設定進階部署策略的 Deployment 元件
會連接至 Metrices Provider 分析部署資料,並設定特定 thresholds(閥值),若在應用程式更新時超過閥值設定就會終止本次更新,並做 Rollbacks 保障系統安全。
例如可以設置 Error Rate 要小於 5%,若超過即中止本次更新,將應用程式 Rollbacks 到前一個版本。
協作做流量分配的工具,如 Nginx Ingress Controller
、Istio
、Traefik
等等。
Argo Rollouts 架構圖,圖片取至 Argo Rollouts- Architecture
在 Day12 - Canary 有使用 Istio 的 virtualService 元件,逐步修改流量比例將 v1 版本流量轉移至 v2 版本實現 Canary Deployment,而 Argo Rollouts 其實就是把手動修改流量比例的過程自動化,降低手動部署時可能造成的風險。
藉由自動化方式,不僅能降低手動部署的風險,也能加速部署時間。
Canary 示意圖,圖片取至 Arogo Rollouts - Concepts
本篇參考 Argo Rollouts Installation,需要將 Argo Rollouts Controller 安裝到 Kubernetes ,並在客戶端安裝 Kubectl Plugin,
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
kubectl get pods -n argo-rollouts
(輸出結果)
NAME READY STATUS RESTARTS AGE
argo-rollouts-76fcfc8d7f-xghlm 1/1 Running 0 121m
Status 為 Running 即安裝成功
接著安裝 Kubectl Argo Rollouts 插件,安裝檔案在 argo-rollouts/releases
curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-darwin-amd64
筆者使用的是 MacOS 版本,若是 Linux 使用者請將
darwin
修改成linux
,若是 windows 用戶請到 Argo Rollouts Kubectl plugin下載 Binary 檔案,並設定好環境變數。
chmod +x ./kubectl-argo-rollouts-darwin-amd64
sudo mv ./kubectl-argo-rollouts-darwin-amd64 /usr/local/bin/kubectl-argo-rollouts
kubectl argo rollouts version
(輸出結果)
kubectl-argo-rollouts: v1.3.1+b0b95ca
BuildDate: 2022-09-29T15:21:35Z
GitCommit: b0b95cade830d8a70624fcaaf8e92e1fe2ecd355
GitTreeState: clean
GoVersion: go1.18.6
Compiler: gc
Platform: darwin/amd64
再來就可以安裝應用程式到 Kubernetes ,實際體驗 ArgoCD 如何與 Istio 結合。本篇使用 ArgoCD 官方提供的 rollouts-demo,筆者已經將部署元件整理到 個人 Github,可以直接 Fork 一份來實作,在 Repo 裡面有以下資料。
├── analysis.yaml
├── destinationrule.yaml
├── gateway.yaml
├── kustomization.yaml
├── namespace.yaml
├── rollout.yaml
├── services.yaml
└── virtualservice.yaml
準備好 Github Repo 之後,就可以使用 ArgoCD 利用 GitOps 的方式部署應用程式,請先依照前一章提供的教學進入到 ArgoCD UI 頁面。
Create
建立 Argo ProjectApplication Name
Project Name
SYNC POLICY
Repository URL
Revision
Path
Cluster URL
雖然使用 Istio、Argo Rollouts 等技術會有更多 Yaml 檔案需要部署,但透過 GitOps 的方式即使再多的部署檔案都能交由 Git 輕鬆管理,透過 CD 工具就能達到一鍵部署。
kubectl get pods -n rollouts-demo-istio
(輸出結果)
NAME READY STATUS RESTARTS AGE
istio-rollout-7f96d86486-qjln5 2/2 Running 0 6m53s
Status 為 Running 即部署成功
再來要如何 Access 到應用程式,請參考 Day16 - Gateway 教學,使用 Minikube Tunnel
讓 istio-ingressgateway
取得 EXTERNAL-IP,並設定好 Static Domain Name,即可透過 Domain Name 連接服務。
sudo vi /etc/hosts
(要修改的內容)
127.0.0.1 localhost
127.0.1.1 myserver
# 在這底下新增 <ingressgateway-ip> istio-rollout.local
http://istio-rollout.local
在瀏覽器即可看到 Argo Rolloouts Demo 應用程式。
本篇介紹 Argo Rollouts 的概念及安裝方式,並用 ArgoCD 透過 GitOps 方式部署應用程式,下一篇會實際使用 Argo Rollouts 完成 Canary 部署。